package com.sy.util;

import com.sy.pojo.RpcRequest;
import com.sy.service.Serializer;
import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.ByteToMessageDecoder;

import java.util.List;

/**
 * 解码工具类，将字节数组解码为 RpcRequest 对象
 */
public class RpcDecoder extends ByteToMessageDecoder {

    private Class<?> clazz;
    private Serializer serializer;

    public RpcDecoder(Class<?> clazz, Serializer serializer) {
        this.clazz = clazz;
        this.serializer = serializer;
    }

    @Override
    protected void decode(ChannelHandlerContext channelHandlerContext, ByteBuf byteBuf, List<Object> list) throws Exception {
        // 标记读取位置
        byteBuf.markReaderIndex();
        // 读取数据长度
        int readInt = byteBuf.readInt();
        // 读取到的数据长度小于0，关闭连接。
        if (readInt < 0) {
            channelHandlerContext.close();
        }
        // 如果读到到的消息体长度小于获取的消息长度，则重置读取位置到标记位置
        if (byteBuf.readableBytes() < readInt) {
            byteBuf.resetReaderIndex();
            return;
        }
        // 将缓冲区的数据读到字节数组
        byte[] bytes = new byte[readInt];
        byteBuf.readBytes(bytes);
        // 反序列化，即将字节数组转化为 RpcRequest 对象
        RpcRequest rpcRequest = (RpcRequest) serializer.deserialize(RpcRequest.class, bytes);
        list.add(rpcRequest);
    }
}
